package com.study.other;

/**
 * @Author tanglingyu
 * @Date: 2021/05/28/ 14:29
 * @Description:循环展开测试
 */
public class CycleUpfold {


  /**
   * 我们知道执行核函数时,通常以warp为单位去执行指令的,
   * 当warp去执行循环时(线程ID去做for的判断条件或者for里有线程ID的if条件 ),会产生分支冲突,增加指令数
   * 所以循环展开可以有效避免分支冲突,提高性能
   *
   * 循环展开会使用更多的寄存器,
   * 编译器在编译的过程中会将确定的量优先存储在寄存器中,
   * 这就导致有些变量会被存储到局部内存(循环展开会消耗更多的寄存器,而不展开是不会的)SM里的寄存器大小是有限的,
   * SM会根据一个块需要消耗的寄存器大小和线程的个数去分配该SM上块的个数,当一个SM连一个块都分配不了时,就会导致内核启动不了
   * 此时的解决办法就只有减少线程的数量去换取更多的寄存器
   * 所以循环的展开应该在寄存器适用的范围去展开,不能过度展开,如何保证不过度展开?就是权衡寄存器大小和线程数量之间的关系
   * @param args
   */

  public static void main(String[] args) {
    System.out.println(test1());
    System.out.println(test2());
  }

  private static int test2() {
    int sum = 0;
    for (int i = 0; i < 100; ++i) {
      sum += i;
    }
    return sum;
  }

  private static int test1() {
    int sum = 0;
    for (int i = 0; i < 100; i += 2) {
      sum += i + i + 1;
    }
    return sum;
  }

}
